# -*- coding: utf-8 -*-
import scrapy
import re
import urllib.parse as parse
from zp.items import ZwItem

class ZhaopinSpider(scrapy.Spider):
    name = "zhaopin"
    allowed_domains = ["sou.zhaopin.com",'jobs.zhaopin.com']
    start_urls = ['http://sou.zhaopin.com/']
    '''
    1.爬虫入口链接https://sou.zhaopin.com/（得到职位列表的URL）
    2.职位列表->得到职位详细页面的URL
    3.职位详细信息
    （得到职位详细信息:(Items)
    职位名称、公司名称、福利信息、职位月薪
    工作地点、发布日期、工作性质、工作经验
    最低学历、招聘人数、职位类别、职位描述
    ）
    '''
    # 完成职位列表的URL抓取
    def parse(self, response):
        # 得到a标签的链接，并且把选择器转换为列表
        p_block=response.xpath('//*[@id="search_right_demo"]/div/p')
        div_block=response.xpath('//*[@id="search_right_demo"]/div/div[@class="clearfixed"]')
        for p_item,div_item in zip(p_block,div_block):
            lb_big=p_item.xpath('a/text()').extract()[0]
            a_link=div_item.xpath('a/@href').extract()
            # 提交链接给新的方法
            for url in a_link:
                #/jobs/searchresult.ashx?jl=530&amp;bj=4010200&amp;sj=006
                url=response.urljoin(url)
                # 还需要做个处理，获取全国的处理，替换jl参数的值
                #https://sou.zhaopin.com/jobs/searchresult.ashx?jl=530&bj=4010200&sj=006
                #https://sou.zhaopin.com/jobs/searchresult.ashx?bj=4010200&sj=006&jl=%E9%80%89%E6%8B%A9%E5%9C%B0%E5%8C%BA&p=1&isadv=0
                #1.正则表达式替换
                re_com=re.compile('jl=(.*?)&')
                url=re_com.sub('489',url)
                #2.参数解析并还原
                # qs=parse.parse_qs(parse.urlparse(response.url).query)
                # qs['jl'][0] = '489'
                # url='http://sou.zhaopin.com/jobs/searchresult.ashx?' + parse.urlencode(qs)
                #3.字符串切片+拼接

                #发送请求
                yield scrapy.Request(url=url,callback=self.parse_list,meta={'lb_big':lb_big})

    # 2.接收职位列表链接，解析得到职位详细信息页面的链接，并完成分页处理
    def parse_list(self,response):
        # 获取详细信息页面的链接
        aLink=response.xpath('//td[@class="zwmc"]/div/a[1]/@href').extract()
        for url in aLink:
            # dont_filter 不做过滤
            # 1.不做去重过滤
            # 2.不做域名验证（allowed_domains）
            # callback 代表url请求发送出去，下载器下载完成之后得到的response交给谁处理
            # if 'xiaoyuan' in url:
            #     yield scrapy.Request(url=url, callback=self.parse_xiaoyun, dont_filter=True)
            # else:
            #     yield scrapy.Request(url=url,callback=self.parse_info,dont_filter=True)
            yield scrapy.Request(url=url, callback=self.parse_info,meta={'lb_big':response.meta['lb_big']})
        # 分页处理
        nextPage=response.xpath('//a[@class="next_page"]/@href').extract()
        # 判断nextPage是否为空，从而知道他是否达到最后一页
        if nextPage:
            yield scrapy.Request(url=nextPage[0],callback=self.parse_list,meta={'lb_big':response.meta['lb_big']})

    # 3.得到职位详细页面链接，并且解析得到里面的职位内容
    def parse_info(self,response):
        # 大分类的类别
        lb_big=response.meta['lb_big']
        # 1.解析得到职位名称
        zwmc=response.xpath('//div[@class="inner-left fl"]/h1/text()').extract()
        # 2.公司名称
        gsmc = response.xpath('//div[@class="inner-left fl"]/h2/a/text()').extract()
        # 3.福利
        flxx=response.xpath('//div[@class="inner-left fl"][1]/div/span/text()').extract()
        # 4.其他信息（使用正则提取，或者xpath）
        #(1)职位月薪
        zwyx=response.xpath('//div[@class="terminalpage-left"]/ul/li[1]/strong/text()').extract()
        #（2）工作地点
        gzdd=response.xpath('//div[@class="terminalpage-left"]/ul/li[2]/strong/a/text()').extract()
        # (3)发布日期
        fbrq=response.xpath('//div[@class="terminalpage-left"]/ul/li[3]/strong/span/text()').extract()
        # (4)工作性质
        gzxz=response.xpath('//div[@class="terminalpage-left"]/ul/li[4]/strong/text()').extract()
        #（5）工作经验
        gzjy=response.xpath('//div[@class="terminalpage-left"]/ul/li[5]/strong/text()').extract()
        # （6）最低学历
        zdxl = response.xpath('//div[@class="terminalpage-left"]/ul/li[6]/strong/text()').extract()
        # （7）招聘人数
        zprs=response.xpath('//div[@class="terminalpage-left"]/ul/li[7]/strong/text()').extract()
        # （8）职位类别
        zwlb = response.xpath('//div[@class="terminalpage-left"]/ul/li[8]/strong/a/text()').extract()
        # 5.职位描述
        zwms=response.xpath('string(//div[@class="tab-inner-cont"]/div)').extract()

        # 交给容器，提交给管道
        zw_item=ZwItem()
        zw_item['lb_big']=lb_big
        if zwmc:
            zw_item['zwmc']=zwmc[0]
            zw_item['gsmc']=gsmc[0]
            zw_item['flxx'] = '|'.join(flxx)
            zw_item['zwyx'] = zwyx[0]
            zw_item['gzdd'] = gzdd[0]
            zw_item['fbrq'] = fbrq[0]
            zw_item['gzxz'] = gzxz[0]
            zw_item['gzjy'] = gzjy[0]
            zw_item['zdxl'] = zdxl[0]
            zw_item['zprs'] = zprs[0]
            zw_item['zwlb'] = zwlb[0]
            zw_item['zwms'] = zwms[0]
            zw_item['url'] = response.url
            return zw_item